﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>#MenuMaskKey - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The #MenuMaskKey directive changes which key is used to mask WIN or ALT keyup events." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>#MenuMaskKey</h1>

<p>更改用来掩饰(屏蔽) <kbd>Win</kbd> 或 <kbd>Alt</kbd> 键松开事件的按键.</p>

<pre class="Syntax"><span class="func">#MenuMaskKey</span> KeyName</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>KeyName</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p><a href="../KeyList.htm">按键名称</a>, <a href="../KeyList.htm#vk">VKnn</a>, <a href="../KeyList.htm#sc">SCnnn</a> 或 VKnnSCnnn 序列.</p>
  </dd>

</dl>

<h2 id="Remarks">备注</h2>
<p>掩饰键会自动发送, 以防止开始菜单或活动窗口的菜单栏在未预期的时间激活.</p>
<p>默认的掩饰键为 <kbd>Ctrl</kbd>. 此指令可用于将掩饰键更改为具有较少副作用的键.</p>
<p>好的候选者是通常不会有效果的虚拟按键代码, 例如 vkE8, 微软的文档是 "未定义的", 或 vkFF, 它被保留为 "没有映射"(一个没有功能的键). 某些值, 如 0 VK 和非 0 SC, 可能无法抑制开始菜单. 按键码不需要匹配按键的存在.</p>
<p class="note"><strong>注意</strong>: Microsoft 可以随时为未指定的键码指定一个效果. 例如, vk07 曾经是未定义的并且可以安全使用, 但从 Windows 10 1909 开始, 它就被保留为打开游戏栏.</p>
<p>指定 <code>vk00sc000</code> 将禁用所有自动掩饰.</p>
<p>这个设置是全局的, 这意味着只需要指定一次(在脚本的任何位置) 就可以影响整个脚本的行为.</p>
<p><strong>Hotkeys:</strong> 如果是使用键盘钩子或鼠标钩子实现的热键, 则最终的按键可能对活动窗口和系统是不可见的. 如果系统 <em>仅</em> 检测到 <kbd>Win</kbd> 或 <kbd>Alt</kbd> 按下和松开, 而期间没有其他键按下, 通常会激活一个菜单. 为防止这种情况发生, 键盘或鼠标钩子可能会自动发送掩饰键.</p>
<p>如果满足以下所有条件, 则按下钩子热键将导致下一个 <kbd>Alt</kbd> 或 <kbd>Win</kbd> 键的松开被屏蔽(发送掩饰键):</p>
<ul>
  <li>热键原有功能被屏蔽(没有<a href="../Hotkeys.htm#Tilde">颚化符修饰键</a>).</li>
  <li>当按下热键时, <kbd>Alt</kbd> 或 <kbd>Win</kbd> 逻辑上是按下的.</li>
  <li>修饰符键物理上被按下或热键需要修饰符是激活的. 例如, <code>$#a::</code> 与 <code>AppsKey::RWin</code> 一起使用时, 当 <kbd>Menu</kbd>+<kbd>A</kbd> 按下时发送掩饰键, 但是 <kbd>Menu</kbd> 本身能打开开始菜单.</li>
  <li>当热键被按下时如果按下了 <kbd>Ctrl</kbd> 键, 则不会掩饰(屏蔽) <kbd>Alt</kbd> 键, 因为 <kbd>Ctrl</kbd>+<kbd>Alt</kbd> 不会激活菜单栏.</li>
  <li>如果最近的 <kbd>Win</kbd> 按下被 <kbd>Ctrl</kbd>, <kbd>Shift</kbd> 或 <kbd>Alt</kbd> 修饰, 则不会掩饰(屏蔽) <kbd>Win</kbd> 键, 因为在这些情况下, 开始菜单通常不会激活. 然而, 如果 <kbd>Win</kbd> 键是最后一次实际按下的键, 其也会出现重复按键的情况, 所以很难预测最近一次的 <kbd>Win</kbd> 键是 <em>何时</em> 按下的.</li>
  <li>要么是没有安装键盘钩子(如鼠标热键), 要么自最近一次 <kbd>Alt</kbd> 或 <kbd>Win</kbd> 按下之后没有其他(未被抑制的) 按下或松开事件发生. 请注意, 即使对于修饰键, 甚至在发送其他键之后, 重复按键也会发生, 但只发生在最后一次物理按下的键上.</li>
</ul>
<p>如果没有安装键盘钩子, 鼠标热键会立即发送掩饰键.</p>
<p>带有<a href="../Hotkeys.htm#Tilde">颚化符修饰键</a>的热键并不会阻止按键的原有功能, 因此不会引发掩饰键. 像 <code>~#a::</code> 这样的热键仍然屏蔽开始菜单, 因为系统检测到 <kbd>Win</kbd> 键已经与另一个键组合使用. 但是, 鼠标热键和 <kbd>Win</kbd> 键本身(<code>~LWin::</code> 和 <code>~RWin::</code>) 不会屏蔽开始菜单.</p>
<p>开始菜单(或活动窗口的菜单栏) 可以通过发送任何按键来屏蔽. 以下示例禁用左 <kbd>Win</kbd> 键激活开始菜单的功能, 同时仍允许将其用于修饰键:</p>
<pre>~LWin::Send "{Blind}{vkE8}"</pre>
<p><strong>Send:</strong> <a href="Send.htm">Send</a>, <a href="ControlSend.htm">ControlSend</a> 和相关的经常释放修饰键作为其正常操作的一部分. 例如, 热键 <code>&lt;#a::SendText Address</code> 通常必须在发送 <em>Address</em> 的内容之前释放左 <kbd>Win</kbd> 键, 之后再按下左 <kbd>Win</kbd> 键(以便其他 <kbd>Win</kbd> 键组合继续工作). 在这种情况下, 可以发送掩码键, 以防止 <kbd>Win</kbd> 或 <kbd>Alt</kbd> 松开后激活菜单.</p>

<h2 id="Related">相关</h2>
<p>有关背景信息, 请参阅<a href="https://www.autohotkey.com/board/topic/20619-extraneous-control-key-presses-generated-by-or-hotkeys/">这个帖子</a>.</p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a>: 基础用法</p>
<pre>#MenuMaskKey vkE8  <em>; 将掩码键改成未分配的按键, 如 vkE8 等.</em>
#Space::Run A_ScriptDir  <em>; 额外的 Ctrl 键不会被触发.</em></pre>
</div>

<div class="ex" id="ExAdvanced">
<p><a href="#ExAdvanced">#2</a>: 展示该指令如何使 vkFF 代替 LControl 被发送.</p>
<pre>#MenuMaskKey vkFF  <em>; vkFF 是未映射的.</em>
#UseHook
#Space::
!Space::
{
    KeyWait "LWin"
    KeyWait "RWin"
    KeyWait "Alt"
    KeyHistory
}</pre>
</div>

</body>
</html>